// 按左断端点排序，遍历前面最小的端点右值，如果比最小的端点右值还小，就需要重新自己取一个空间
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

const int N = 100010;
struct Range
{
    int l, r;
    bool operator<(const Range &w) const
    {
        return l < w.l;
    }
} range[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        int l, r;
        cin >> l >> r;
        range[i] = {l, r};
    }
    sort(range, range + n);
    priority_queue<int, vector<int>, greater<int>> maxR;
    for (int i = 0; i < n; ++i)
    {
        // 如果优先队列是空或者最小右节点都比当区间的左端点大，就需要新建立一个分组
        // if(maxR.empty() || maxR.top() >= range[i].l )
        //     maxR.push(range[i].r);
        // 如果比该组的最大右端点大，更新最右端点
        if (!maxR.empty() && maxR.top() < range[i].l)
            maxR.pop();
        /*else
        {
            maxR.pop();
            maxR.push(range[i].r);
        }*/
        maxR.push(range[i].r);
    }
    cout << maxR.size() << endl;
    return 0;
}